import axios from 'axios'
import { Toast } from 'vant'
import store from '../../src/store/index'
import router from '../router/index'

// 调用 axios.create() 方法，创建 axios 的实例对象
const request = axios.create({
  // 请求根路径
  baseURL: 'http://www.liulongbin.top:8000'
  // baseURL: 'http://192.168.141.73:8000'

})
request.interceptors.request.use(
  config => {
    // 展示 loading 效果
    Toast.loading({
      message: '加载中...', // 文本内容
      duration: 0 // 展示时长(ms)，值为 0 时，toast 不会消失
    })
    const tokenStr = store.state.tokenInfo.token
    if (tokenStr) {
      config.headers.Authorization = 'Bearer ' + tokenStr
    }
    return config
  },
  error => {
    Toast.clear()
    // 如果有响应的结果，并且响应的状态码是 401，则证明 Token 过期了
    // if (error.response.status === 401) {
    //   console.log('token 过期啦')
    //   // TODO1：清空 vuex 和 localStorage 中的数据
    //   store.commit('cleanState')
    //   // TODO2：强制跳转到登录页，并通过路由的 query 查询参数，把当前用户“访问未遂的路由地址”带给登录页
    //   router.replace('/login?pre=' + router.currentRoute.fullPath)
    // }

    return Promise.reject(error)
  }
)

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    // 隐藏 loading 效果
    Toast.clear()
    return response
  },
  async function (error) {
    // 对响应错误做点什么

    const refreshToken = store.state.tokenInfo.refresh_token
    // eslint-disable-next-line no-cond-assign
    if (error.response.status = 401 && refreshToken) {
      try {
        const { data: res } = await axios({
          method: 'put',
          url: 'http://www.liulongbin.top:8000/v1_0/authorizations',
          headers: {
            Authorization: 'Bearer ' + refreshToken
          }
        })
        console.log('换取')
        store.commit('updateTokenInfo', { token: res.data.token, refresh_token: refreshToken })
        return request(error.config)
      } catch {
        store.commit('cleanState')
        router.replace('/login?pre=' + router.currentRoute.fullPath)
      }
    }
    // 隐藏 loading 效果
    Toast.clear()
    return Promise.reject(error)
  }
)

export default request
